# Auther：wujehy
# email:wujehy@qq.com
# @File : APIUnit.py 
# @Time : 19-4-17 上午4:51

"""
 这个　类　是　处理的　ＡＰＩ 自写　接口类　
    作用是　处理　自定义　ａｐｉ
        ｄａｔａＳｈｅｅｔ 是　数据表　用于　标记　你要上传的数据协议
            因为　传感器　的　ａｐｐｉｄ　　和　数据位　两个　属性确定　一个具体的传感器值　所以　通过　编写　对应的数值　进行处理



 dataSheet
 是 自定传感器的信息表，有　ｊｓｏｎ　数据　格式构成
 这是一个例子

    id_0xYYYY:ZZ:{
            "name": "temp", //传感器英文名　用于储存在数据库的名称　
            "cn_name": "温度",　//　具体意思　
            "unit": "℃",　　//　单位
            "type": "float",　//　原始数据类型　作用是　给　ｓｅｎｓｏｒＶａｌｕｅ　方法　处理　可以自定
            "note": "DHT11"　　//备注
        }

    对应　的　处理方法：
        # 如果是　ｆｌｏａｔ　类型　则　数据区　也就是　０1 [panid] [len] [ｉｄ　ＸＸ ＹＹ]　\r\n
        # 中的　ｌｅｎ 后面的　三字节　区　0xＸＸＹＹ 中　高位是　整数部分　低位　是　小数部分　那就是　ＸＸ.YY
        # 及　0x1234 就是　0x12.0x34 也就是　１８．５２　的　意思
        if sensor["type"] is "float":
            return "%s.%s" % ((value & 0xff00) >> 8, value & 0xff)

    这是　另一个　例子
    id_0xYYYY:ZZ:{
            "name": "flame",
            "cn_name": "火焰",
            "unit": "％",
            "type": "adc",　//　不同的　类型　
            "max": 100,　　　//　对应的属性
            "min": 0,　　　　// 这些属性　是　自己定义　　用于运算
            "power": 1024,　//　上面的　是　ａｄｃ　的　最大值　和最小值　ｐｏｗｅｒ　是　权
            "note": "火焰传感器"　//　说明
        }

    对应　：
        # 如果是　ａｄｃ　类型　则　直接　用　ａｄｃ　算法　返回　
        elif sensor["type"] is "adc":
            return (value / sensor["power"]) * (sensor["max"] - sensor["min"]) + sensor["min"]


    如果是　自定义　数据　则　可以通过自己添加　自己的规则　进行　实现

    同时　如果未定义的　则　原始值　直接返回
　id 是 这个传感器 的 唯一标识 组成 是 id_[appid]:[信息位]

 id 的值 是对应 的信息 : 必须有
     name 对应数据库的英文名
     cn_name:中文名
     unit :单位 没有单位时 为空
     type :　数据的　类型对应　处理的方式
     note :备注

 如果是　ａｄｃ　的　数据表　则　多了　最大值　和最小值　和　分辨率
     type:adc
     max:最大值
     min:最小值
     power：　adc　的指标
     算法　真实数据　＝ｖａｌｕｅ／ｐｏｗｅｒ＊（ｍａｘ-ｍｉｎ）＋ｍｉｎ
 """
class APIUnit():

    dataSheet = {
        "id_0x5001:1": {
            "name": "temp",
            "cn_name": "温度",
            "unit": "C",
            "type": "float",
            "note": "DHT11"
        },
        "id_0x5001:2": {
            "name": "humt",
            "cn_name": "湿度",
            "unit": "%",
            "type": "float",
            "note": "DHT11"
        },
        "id_0x5004:1": {
            "name": "flame",
            "cn_name": "火焰",
            "unit": "%",
            "type": "adc",
            "max": 100,
            "min": 0,
            "power": 1024,
            "note": "火焰传感器"
        },
        "id_0x1234:1": {
            "name": "flameT",
            "cn_name": "火焰",
            "unit": "%",
            "type": "adc",
            "max": 100,
            "min": 0,
            "power": 1024,
            "note": "火焰传感器"
        }
    }

    # ｔｙｐｅ　的　处理方法　每个数据上传的　有　３　类
    # 浮点，整数　以及　ａｄｃ　信息　
    # 备注　使用　ａｄｃ　是为了方便我们使用ａｒｄｕｉｎｏ　开发　
    # 这样　直接　将　ａｄｃ　值上传　不需要解析　即可使用　快准狠　
    def sensorValue(self, sensorType, value):
        """
        将　传感器的值　处理成　具体数值的方式　
        :param type: 类型　
        :param value: value　就是　０ｘ１２．０ｘ３４　这样　类型的数据　前　是　整数部分　后是　小数部分
                    　　ａｄｃ　就是　这两个　数据是　ａｄｃ　直接　换算
        :return:　返回真实数据
        """
        try:
            sensor = self.dataSheet[sensorType]
            # 浮点型
            if sensor["type"] is "float":
                return float("%s.%s" % ((value & 0xff00) >> 8, value & 0xff))
            elif sensor["type"] is "adc":
                return (value / sensor["power"]) * (sensor["max"] - sensor["min"]) + sensor["min"]
            elif sensor[type] is "Test":
                # 测试
                return value
        except:
            return value
    def sensorUnit(self, sensorType):

        try:
            sensor = self.dataSheet[sensorType]
            # 浮点型
            return sensor["unit"]
        except:
            return ""

    def sensorCn_name(self, sensorType):

        try:
            sensor = self.dataSheet[sensorType]
            # 浮点型
            return sensor["cn_name"]
        except:
            return ""


    def SensorNamebyAppidAndID(self,Appid:int,id:int):
        """
        datasheet 是 传感器的 信息表

        功能 通过 id 获得 传感器的 名字 name
        :param Appid: 传过来的 拼接 的appid
        :param id: 所在 信息位
        :return:
        """
        try:
            return self.dataSheet["id_%s:%s"%(hex(Appid),id)]["name"]
        except:
            return "id_0x%s:%s"%(hex(Appid)[2:6],id)
    def SensorNamebyAppid_id(self,Appid_id):
        """
        datasheet 是 传感器的 信息表

        功能 通过 id 获得 传感器的 名字 name
        :param Appid: 传过来的 拼接 的appid
        :param id: 所在 信息位
        :return:
        """
        try:
            return self.dataSheet["id_%s"%Appid_id]["name"]
        except:
            return "id_%s"%Appid_id

